package com.bit.demo1;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: kano
 * Date: 2025-02-16
 * Time: 11:31
 */
public  class Student {
    public String name;
    public String gender;
    public int age;
    public double score;
    public static String classRoom = "bit11" ; //静态成员变量 --- C++中要求必须在类外声明Java不需要，但都没规定必须要初始化会给0值
//    public static String classRoom = “bit201; 这是就地初始化 在定义时给出初始值
    public Student(String name,String gender,int age,double score)
    {
        System.out.println(" Student(String name,String gender,int age,double score)");
    }

    public Student()
    {
        System.out.println("Student()");
    }

     //常用于提取构造函数的共同量,减少各个构造函数的代码而产生
    //实例化代码块：必须放在类内，在调用构造之前都会调用，相当于是C++的初始化列表
    {
        this.name = name;  //注意：由于实例初始化块是在构造器之前运行的，它不能使用构造器参数传递的值。
        this.gender = gender;
        this.age = age;
        this.score = score;
        System.out.println("Instance block initialized");
    }
//    静态代码块不管生成多少个对象，其只会执行一次，加载类时执行
//    静态成员变量是类的属性，因此是在JVM加载类时开辟空间并初始化的
    //注意：Java虚拟机启动时被指定的主类：即包含main方法的类，会加载类;C++中的类是在程序编译链接时被加载进来的
    static
    {
        classRoom = "bit201";
        System.out.println("I am a static init1()!");
    }
    //如果一个类中包含多个静态代码块，在编译代码时，编译器会按照定义的先后次序依次执行(合并)
    //比如这里会先执行上面的静态代码块 再执行下面那个
    static
    {
        System.out.println("I am a static init2()!");
    }

   public void func()
   {
       System.out.println("func()");
   }

    public static  String GetClassroom() //static修饰的方法叫静态成员方法
    {
//        age +=1;  静态方法不允许（注意是直接！！）访问非静态变量 因为无法引用this
        Student st  = new Student();
        System.out.println(st.age); //间接访问
        //st.func();
        //Student(); 也无法调用非静态方法，因为无法传递this给他们
        return classRoom;
    }

    public static void main(String[] args) {
        //静态成员变量被所有对象共享，放在方法区
        //生命周期随类的一生
        //1.可以通过类名访问
//        System.out.println(Student.classRoom);
//        //2.也可以通过对象访问
//        Student s1 = new Student("ALLEN","男",12,3.4);
//        Student s2 = new Student();
//         System.out.println(s1.name);
//        System.out.println(s1.classRoom);
//        Student.classRoom = "hah";
//       //3.静态成员一般是通过静态方法访问 可以通过类名 也可以对象访问
//        System.out.println("打印静态成员" + Student.GetClassroom());//推荐
//        System.out.println(s1.GetClassroom());

    }
}

//class og
//{
//    public static int num;
//    static
//    {
//        System.out.println("static init()");
//    }
//
//    public static void main(String[] args) {
//    }
//
//}